package com.chaike.hsq.bean.response.pay;

import com.chaike.common.util.StringUC;
import com.chaike.core.json.JsonUtil;
import com.chaike.hsq.bean.response.BizBaseResponse;
import com.chaike.hsq.exception.HuiShouQianCheckException;
import com.fasterxml.jackson.annotation.JsonAlias;
import com.google.gson.annotations.SerializedName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;

import java.io.Serializable;

/**
 * 慧收钱 小程序支付 响应参数.
 * 文档地址：https://docs.huishouqian.com/HSQ_PAY/HSQ-AppletPayAPI.html
 *
 * @author Luo
 * @version 1.0
 * @date 2021-10-14 10:36
 */
@Data
@Accessors(chain = true)
@EqualsAndHashCode(callSuper = true)
public class AppletsPayResponse extends BizBaseResponse implements Serializable {

    private static final long serialVersionUID = 5190642453439420460L;

    /**
     * <pre>
     * 字段名：商户订单号.
     * 变量名：transNo
     * 是否必填：是
     * 类型：string[1,64]
     * 描述：
     *    原样返回商户订单号
     * </pre>
     */
    private String transNo;

    /**
     * <pre>
     * 字段名：交易订单号.
     * 变量名：tradeNo
     * 是否必填：是
     * 类型：string[1,64]
     * 描述：
     *    慧收钱交易订单号
     * </pre>
     */
    private String tradeNo;

    /**
     * <pre>
     * 字段名：交易金额.
     * 变量名：orderAmt
     * 是否必填：是
     * 类型：string[1,16]
     * 描述：
     *    订单交易金额
     * </pre>
     */
    private String orderAmt;

    /**
     * <pre>
     * 字段名：交易状态.
     * 变量名：orderStatus
     * 是否必填：是
     * 类型：string[1,16]
     * 描述：
     *    详见交易状态码
     * </pre>
     *
     * @see com.chaike.hsq.consts.HsqPayEnum.OrderStatus
     */
    private String orderStatus;

    /**
     * <pre>
     * 字段名：完成时间.
     * 变量名：finishedDate
     * 是否必填：是
     * 类型：string[1,16]
     * 描述：
     *
     * </pre>
     */
    private String finishedDate;

    /**
     * <pre>
     * 字段名：预支付交易会话标识.
     * 变量名：qrCode
     * 是否必填：是
     * 类型：string[1,1024]
     * 描述：
     *    返回唤醒支付的参数，唤醒方式可参考：
     *    微信：https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_5_4.shtml
     *    支付宝：https://opendocs.alipay.com/mini/api/openapi-pay
     * </pre>
     */
    private String qrCode;

    /**
     * <pre>
     * 字段名：慧收钱上送三方支付的交易订单号.
     * 变量名：channelOrderNo
     * 是否必填：是
     * 类型：string[1,64]
     * 描述：
     *    慧收钱上送三方支付的交易订单号
     * </pre>
     */
    private String channelOrderNo;

    /**
     * <pre>
     * 字段名：附加字段.
     * 变量名：extend
     * 是否必填：否
     * 类型：string[1,128]
     * 描述：
     *    附加数据，在查询API和支付通知中原样返回，可作为自定义参数使用
     * 示例值：自定义数据
     * </pre>
     */
    private String extend;

    /**
     * <pre>
     * 字段名：交易类型.
     * 变量名：payType
     * 是否必填：是
     * 类型：string[1,32]
     * 描述：
     *    ALI_APPLET：支付宝
     *    WECHAT_APPLET：微信
     * </pre>
     *
     * @see com.chaike.hsq.consts.HsqPayEnum.Type
     */
    private String payType;

    /**
     * 获取微信支付返回参数.
     *
     * @return 结果
     */
    public WxPayResult getWxPayResult() {
        if (StringUC.isBlank(getQrCode())) {
            throw new HuiShouQianCheckException(getRespMsg());
        }
        String json = getQrCode().replaceAll("\\\\\"", "\"");
        return JsonUtil.parse(json, WxPayResult.class);
    }

    /**
     * 微信预支付交易会话返回数据.
     */
    @Data
    @Accessors(chain = true)
    public static class WxPayResult implements Serializable {

        private static final long serialVersionUID = -9076459310645040106L;

        /**
         * <pre>
         * 字段名：应用ID.
         * 变量名：appid
         * 是否必填：否
         * 类型：string[1,64]
         * 描述：
         *    微信公众号APPID
         * 示例值：wxd678efh567hg6787
         * </pre>
         */
        private String appId;

        /**
         * <pre>
         * 字段名：时间戳.
         * 变量名：timeStamp
         * 是否必填：是
         * 类型：string[1,32]
         * 描述：
         *
         * </pre>
         */
        private String timeStamp;

        /**
         * <pre>
         * 字段名：随机字符串.
         * 变量名：nonceStr
         * 是否必填：是
         * 类型：string[1,64]
         * 描述：
         *     随机字符串，不长于32位
         * </pre>
         */
        private String nonceStr;

        /**
         * <pre>
         * 字段名：订单详情扩展字符串.
         * 变量名：package
         * 是否必填：是
         * 类型：string[1,128]
         * 描述：
         *      统一下单接口返回的prepay_id参数值，提交格式如：prepay_id=***
         *      由于package为java保留关键字，因此改为packageValue. 前端使用时记得要更改为package
         * </pre>
         */
        @JsonAlias("package")
        @SerializedName("package")
        private String packageValue;

        /**
         * <pre>
         * 字段名：签名方式.
         * 变量名：signType
         * 是否必填：是
         * 类型：string[1,32]
         * 描述：
         *      签名类型，默认为MD5，支持HMAC-SHA256和MD5。注意此处需与统一下单的签名类型一致
         * </pre>
         */
        private String signType;

        /**
         * <pre>
         * 字段名：支付签名.
         * 变量名：paySign
         * 是否必填：是
         * 类型：string[1,64]
         * 描述：
         *
         * </pre>
         */
        private String paySign;

    }

}
